﻿using System;
using System.Linq;
using CTS.Com.Domain.Constants;
using CTS.Com.Domain.Helper;
using CTS.Data.Domain.Dao;
using CTS.W._150101.Models.Domain.Common.Constants;
using CTS.W._150101.Models.Domain.Common.Dao;
using CTS.W._150101.Models.Domain.Object.Admin.Categories;
using CTS.Web.Com.Domain.Helper;

namespace CTS.W._150101.Models.Domain.Dao.Admin
{
    /// <summary>
    /// MasterCategoriesEntryDao
    /// </summary>
    public class MasterCategoriesEntryDao : GenericDao<EntitiesDataContext>
    {
        // Định nghĩa hằng file sql
        public const string MASTERCATEGORIESENTRYDAO_GETINFO_SQL = "MasterCategoriesEntryDao_GetInfo.sql";

        /// <summary>
        /// Lấy thông tin chủng loại
        /// </summary>
        public CategoryObject GetInfo(string localeCd, string categoryCd)
        {
            // Tạo tham số
            var param = new {
                LocaleCd = localeCd,
                CategoryCd = categoryCd
            };
            // Kết quả trả về
            return GetObjectByFile<CategoryObject>(MASTERCATEGORIESENTRYDAO_GETINFO_SQL, param);
        }

        /// <summary>
        /// Kiểm tra tồn tại chủng loại
        /// </summary>
        public bool IsExist(string localeCd, string categoryCd)
        {
            var linq = from tbl in EntityManager.MACategories
                       where tbl.LocaleCd == localeCd
                       && tbl.CategoryCd == categoryCd
                       select tbl;
            var count = linq.Count();
            return count == decimal.One;
        }

        /// <summary>
        /// Kiểm tra tồn tại tên chủng loại
        /// </summary>
        public bool IsUnique(string categoryCd, string categorySearchName)
        {
            var linq = from tbl in EntityManager.MACategories
                       where tbl.CategoryCd != categoryCd
                       && tbl.CategorySearchName == categorySearchName
                       select tbl;
            var count = linq.Count();
            return count != decimal.One;
        }

        /// <summary>
        /// Thêm chủng loại
        /// </summary>
        public void Insert(CategoryObject data)
        {
            var entity = GetMACategory(data);
            entity.LocaleCd = Logics.LOCALE_DEFAULT;
            entity.VersionNo = decimal.One;
            entity.CreateUser = WebContextHelper.UserName;
            entity.CreateDate = DateTime.Now;
            entity.UpdateUser = WebContextHelper.UserName;
            entity.UpdateDate = DateTime.Now;
            EntityManager.MACategories.InsertOnSubmit(entity);
        }

        /// <summary>
        /// Cập nhật chủng loại
        /// </summary>
        public void Update(CategoryObject data)
        {
            var linq = from tbl in EntityManager.MACategories
                       where tbl.LocaleCd == data.LocaleCd
                       && tbl.CategoryCd == data.CategoryCd
                       select tbl;
            var entity = linq.Single();
            // Cập nhật thông tin
            if (!DataCheckHelper.IsNull(data.CategoryName)) {
                entity.CategoryName = data.CategoryName;
            }
            if (!DataCheckHelper.IsNull(data.CategorySearchName)) {
                entity.CategorySearchName = data.CategorySearchName;
            }
            if (!DataCheckHelper.IsNull(data.SortKey)) {
                entity.SortKey = data.SortKey;
            }
            if (!DataCheckHelper.IsNull(data.DeleteFlag)) {
                entity.DeleteFlag = data.DeleteFlag;
            }
            entity.VersionNo = entity.VersionNo + decimal.One;
            entity.UpdateUser = WebContextHelper.UserName;
            entity.UpdateDate = DateTime.Now;
        }

        /// <summary>
        /// Khởi tạo đối tượng chủng loại
        /// </summary>
        public MACategory GetMACategory(CategoryObject data)
        {
            // Khởi tạo biến cục bộ
            var result = DataHelper.CopyObject<MACategory>(data);
            // Gán giá trị trả về
            result.CategoryDiv = W150101Logics.CD_CATEGORY_DIV_NORMAL;
            // Kết quả trả về
            return result;
        }
    }
}
